package net.sansi.v3correctserver.service.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by Fang
 * create time : 2025/2/17
 * IDE : IntelliJ IDEA
 * <p>
 * websocket 连接管理器
 */

@Slf4j
public abstract class WebsocketManager {

    // 连接池
    private final Set<WebSocketSession> sessions = new HashSet<>();
    private final Set<Event> events = new HashSet<>();

    /**
     * 添加连接
     *
     * @param session 连接
     */
    public void addSession(WebSocketSession session) {
        if (session == null) return;
        sessions.add(session);
    }

    /**
     * 移除连接
     *
     * @param session 连接
     */
    public void removeSession(WebSocketSession session) {
        if (session == null) return;
        sessions.remove(session);
    }

    /**
     * 发送消息
     *
     * @param message 消息
     */
    public synchronized void sendMessage(String message) {
        sessions.forEach(session -> {
            try {
                session.sendMessage(new TextMessage(message));
            } catch (Exception e) {
                log.error("send message error", e);
            }
        });
    }

    /**
     * 收到消息后触发
     *
     * @param message 消息
     */
    public void trigger(String message) {
        events.forEach(sessions -> {
            sessions.onEvent(message);
        });
    }

    /**
     * 添加事件
     *
     * @param event 事件
     */
    public void addEvent(Event event) {
        events.add(event);
    }

    /**
     * 移除事件
     *
     * @param event 事件
     */
    public void removeEvent(Event event) {
        events.remove(event);
    }

    /**
     * 事件
     * 用来设置收到消息后的回调函数
     */
    public static interface Event {
        void onEvent(String message);
    }
}
